const axios = require('axios')
const redis = require('./redis')
const getExternalToken = require('./getExternalToken')
const log4js = require('./log4')
const logger = log4js.getLogger('server/utils/request.js')

/**
 * 创建 axios 实例并添加拦截器
 */
const service = axios.create({
  baseURL: process.env.ZT_HTTP_URL,
  timeout: 50000 // 请求超时时间
})

/**
 * 请求拦截器
 * @param {object} config - axios 配置对象
 * @returns {object} 处理后的配置对象
 */
service.interceptors.request.use(
  async config => {
    try {
      const token = await redis.get('ZT_APP_TOKEN')

      if (!token) {
        token = await getExternalToken() // 获取 token
      }

      config.headers.token = token // 设置 token

      return config
    } catch (error) {
      logger.error('请求拦截器错误:', error) // 记录错误
      return Promise.reject(error) // 拒绝 Promise
    }
  },
  error => {
    logger.error('请求拦截器错误:', error) // 记录错误
    return Promise.reject(error) // 拒绝 Promise
  }
)

/**
 * 响应拦截器
 * @param {object} response - axios 响应对象
 * @returns {object} 处理后的响应对象
 */
service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.status !== 1) {
      logger.error('响应状态码不是 1:', res.msg) // 记录错误
      return Promise.reject(res.msg) // 拒绝 Promise
    }
    return res // 返回响应数据
  },
  error => {
    logger.error('响应拦截器错误:', error) // 记录错误
    return Promise.reject(error) // 拒绝 Promise
  }
)

module.exports = service
